<?php

require_once 'Basic.php';

class NullFormFieldTypeException extends Exception {
  public function __construct($message = "", $code = 0, $previous = null) {
    parent::__construct($message, $code, $previous);
  }
}

/**
 * Um FormField especifica um campo de algum formulário. Contem informação sobre validação, geração de html, e 
 * relacionados.
 */
class FormField {
  
  private $required;
  private $name;
  private $label;
  private $formFieldType;
  private $value;
  private $valid;
  
  /**
   * 
   * @param boolean $required Se esse campo é requerido ou não.
   * @param string $name O nome (name) do html.
   * @param string $label O texto que deve vir junto do elemento de entrada (input, select, ...) no campo.
   * @param FormFieldType $formFieldType O tipo de FormField (algum FormFieldType).
   * @param mixed $value O seu valor corrente.
   * @param boolean $valid O campo está válido, atualmente?
   * @throws NullFormFieldTypeException Se $formFieldType for null.
   */
  public function __construct($required, $name, $label, FormFieldType $formFieldType, $value = null, $valid = true) {
    $this->required = $required;
    $this->name = $name;
    $this->label = $label;
    $this->value = $value;
    $this->valid = $valid;
    if($formFieldType === null) {
      throw new NullFormFieldTypeException();
    }
    $this->formFieldType = $formFieldType;
  }
  
  public function required() {
    return $this->required;
  }
  
  public function name() {
    return $this->name;
  }
  
  public function label() {
    return $this->label;
  }
  
  public function type() {
    return $this->formFieldType;
  }
  
  public function value() {
    return $this->value;
  }
  
  public function valid() {
    return $this->valid;
  }
  
  public function setValue($newValue) {
    $this->value = $newValue;
  }
  
  public function setValid($valid) {
    $this->valid = $valid;
  }
  
  public function validate() {
    return $this->formFieldType->validate($this->value);
  }
  
  public function getHtml() {
    $labelClass = "label";
    $this->formFieldType->clearHtmlClass();
    if($this->required) {
      $this->formFieldType->addHtmlClass("required");
      $labelClass .= " required";
    }
    if($this->valid === false) {
      $this->formFieldType->addHtmlClass("invalid");
      $labelClass .= " invalid";
    }
    return "<p><span class='${labelClass}'>" . $this->label . '</span>' .
           $this->formFieldType->getHtml($this->name, $this->value) . '</p>';
  }
  
}
